package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.log4j.Logger;
import org.primefaces.event.RowEditEvent;
import org.springframework.context.annotation.Scope;

import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.ConstantesWeb;
import pe.com.cotelasa.scp.controlador.backingBean.BKLetraPorPagar;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_LETRA_DE_CAMBIO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.modelo.LetraPorPagarModel;
import pe.com.cotelasa.scp.dominio.service.IServicioBanco;
import pe.com.cotelasa.scp.dominio.service.IServicioCliente;
import pe.com.cotelasa.scp.dominio.service.IServicioCompraFacturacion;
import pe.com.cotelasa.scp.dominio.service.IServicioLetraDeCambio;
import pe.com.cotelasa.scp.dominio.service.IServicioProveedor;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoMoneda;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaFacturacion;
import pe.com.cotelasa.scp.entidad.Banco;
import pe.com.cotelasa.scp.entidad.CompraFacturacion;
import pe.com.cotelasa.scp.entidad.DetalleLetra;
import pe.com.cotelasa.scp.entidad.Letra;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.entidad.TipoMoneda;
import pe.com.cotelasa.seguridad.common.util.Constantes.EstadoRegistro;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@Named(value = "MBLetraPorPagar")
@Scope("request")
public class MBLetraPorPagar extends MBGenerico implements IMantenedor, Serializable {

	private static final long serialVersionUID = -8863078593063550746L;
	private static Logger logger = Logger.getLogger(MBLetraPorPagar.class);
	@Inject
	private BKLetraPorPagar bkLetraPorPagar;
	@Inject
	private IServicioLetraDeCambio servicioLetraDeCambio;
	@Inject
	private IServicioTipoMoneda servicioTipoMoneda;
	@Inject
	private IServicioCliente servicioCliente;
	@Inject
	private IServicioProveedor servicioProveedor;
	@Inject
	private IServicioVentaFacturacion servicioVentaFacturacion;
	@Inject
	private IServicioCompraFacturacion servicioCompraFacturacion;
	@Inject
	private IServicioCompraFacturacion servicioFactura;
	@Inject
	private IServicioBanco servicioBanco;
	@Inject
	private BKSession bkSession;
 	

	public String mostrarMantenimiento() {
		try {
			limpiar();
			cargarCombo();
		} catch (ServiceException e) {
			e.printStackTrace();
			mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
			logger.error(e.getMessage(), e);
		}
		return URLPaginacion.LetraPorPagar.URL_FORMULARIO_LETRA_POR_PAGAR;
	}
	
	private void cargarCombo() throws ServiceException{
		this.bkLetraPorPagar.getComboProveedores().clear();
		this.bkLetraPorPagar.getComboBancos().clear();
		this.bkLetraPorPagar.getComboTipoMonedas().clear();
		this.bkLetraPorPagar.getComboEstadoLetras().clear();
		this.bkLetraPorPagar.getComboTipoMonedasBusqueda().clear();
		this.bkLetraPorPagar.getComboEstadoLetrasBusqueda().clear();
		this.bkLetraPorPagar.getComboProveedoresBusqueda().clear();
		Collection<Proveedor> collecionProveedor = servicioProveedor.listarProveedorActivos();
		this.bkLetraPorPagar.getComboProveedoresBusqueda().add(new SelectItem(0,"Todos"));
		this.bkLetraPorPagar.getComboProveedores().add(new SelectItem(0,"Seleccione"));
		for (Proveedor proveedor : collecionProveedor) {
			this.bkLetraPorPagar.getComboProveedores().add(new SelectItem(proveedor.getId(),proveedor.getRazonSocial()));
			this.bkLetraPorPagar.getComboProveedoresBusqueda().add(new SelectItem(proveedor.getId(),proveedor.getRazonSocial()));
		}
		
		Collection<Banco> collecionBanco = servicioBanco.listarBancosActivos();
		this.bkLetraPorPagar.getComboBancos().add(new SelectItem(0,"Seleccione"));
		for (Banco banco : collecionBanco) {
			this.bkLetraPorPagar.getComboBancos().add(new SelectItem(banco.getId(),banco.getNombre()));
		}
		
		Collection<TipoMoneda> collectionTipoMoneda = servicioTipoMoneda.listarTipoMonedasActivos();
		this.bkLetraPorPagar.getComboTipoMonedasBusqueda().add(new SelectItem(0,"Todos"));
		this.bkLetraPorPagar.getComboTipoMonedas().add(new SelectItem(0,"Seleccione"));
		for (TipoMoneda tipoMoneda : collectionTipoMoneda) {
			this.bkLetraPorPagar.getComboTipoMonedas().add(new SelectItem(tipoMoneda.getId(),tipoMoneda.getNombre()));
			this.bkLetraPorPagar.getComboTipoMonedasBusqueda().add(new SelectItem(tipoMoneda.getId(),tipoMoneda.getNombre()));
		}
		
		for (ESTADO_LETRA_DE_CAMBIO estadoLetraDeCambio : ESTADO_LETRA_DE_CAMBIO.values()) {
			this.bkLetraPorPagar.getComboEstadoLetras().add(new SelectItem(estadoLetraDeCambio,estadoLetraDeCambio.getNombre()));
			if(estadoLetraDeCambio.getId() != estadoLetraDeCambio.SELECCIONE.getId()){
				this.bkLetraPorPagar.getComboEstadoLetrasBusqueda().add(new SelectItem(estadoLetraDeCambio,estadoLetraDeCambio.getNombre()));
			}
		}
		
		this.bkLetraPorPagar.setEstadoSeleccionado(ESTADO_LETRA_DE_CAMBIO.TODOS);
	}
	

	public void buscarListaLetrasPorPagar() {
		try {
			Letra letra = new Letra();
			letra.getProveedor().setId(bkLetraPorPagar.getProveedorSeleccionado().getId());
			letra.setEstadoLetra(bkLetraPorPagar.getEstadoSeleccionado().getId());
			letra.getTipoMoneda().setId(bkLetraPorPagar.getTipoMonedaSeleccionado().getId());
			letra.setTipoLetra(Constantes.TipoLetra.LETRA_POR_PAGAR);
			bkLetraPorPagar.setListaLetrasPorPagar(servicioLetraDeCambio.listarLetrasPorFiltro(letra));	
		} catch (Exception e) {
			mostrarError("Ocurrieron algunos problemas al buscar la informacion." + e.getMessage());
			logger.error(e.getMessage(), e);
		}
	}
	
	private boolean validarBusqueda(){
		if(bkLetraPorPagar.getProveedorSeleccionado().getId() == 0){
			mostrarWarning("Seleccionar Proveedor");
			return false;
		}else if(bkLetraPorPagar.getEstadoSeleccionado().equals(ESTADO_LETRA_DE_CAMBIO.SELECCIONE)){
			mostrarWarning("Seleccionar Estado");
			return false;
		}else if(bkLetraPorPagar.getTipoMonedaSeleccionado().getId() == 0 ){
			mostrarWarning("Seleccionar Tipo Moneda");
			return false;
		}
		return true;
	}
	
	private boolean validarFacturasPorPagar(){
		if(this.bkLetraPorPagar.getProveedorSeleccionado().getId() == 0){
			mostrarWarning("Seleccione un Proveedor");
			return false;
		}else if(this.bkLetraPorPagar.getTipoMonedaSeleccionado().getId() == 0){
			mostrarWarning("Seleccione el tipo de moneda");
			return false;
		}
		return true;
	}
	
	public void buscarListaFacturasPorPagar(){
		try{
			if(validarFacturasPorPagar()){
				System.out.println("Buscar Lista Facturas");
				logger.info("Buscar Lista Facturas");
				CompraFacturacion compraFacturacion = new CompraFacturacion();
				compraFacturacion.getIdProveedor().setId(this.bkLetraPorPagar.getProveedorSeleccionado().getId());
				compraFacturacion.getIdTipoMoneda().setId(this.bkLetraPorPagar.getTipoMonedaSeleccionado().getId());
				bkLetraPorPagar.setListaFacturasPorCobrar(servicioCompraFacturacion.obtenerFacturasCompraParaLetras(compraFacturacion));
				bkLetraPorPagar.setLetraPorPagarModel(new LetraPorPagarModel(new ArrayList<CompraFacturacion>(bkLetraPorPagar.getListaFacturasPorCobrar())));
				logger.info(bkLetraPorPagar.getListaFacturasPorCobrar().size());
				System.out.println(bkLetraPorPagar.getListaFacturasPorCobrar().size());
			}	
		}catch(Exception e){
			e.printStackTrace();
			mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
			logger.error(e.getMessage(), e);
		}	
	}
	
	@Override
	public String actualizar() {
		// TODO Auto-generated method stub
		return null;
	}
	
	public void selectFactura(){
		System.out.println("Seleccionar Factura");
		CompraFacturacion[] compraFacturacion = this.bkLetraPorPagar.getFacturasSeleccionadas();
		this.bkLetraPorPagar.setMontoTotal(new BigDecimal(0));
		for (CompraFacturacion compraFacturacion2 : compraFacturacion) {
			System.out.println(compraFacturacion2.getId());
			this.bkLetraPorPagar.setMontoTotal(this.bkLetraPorPagar.getMontoTotal().add(compraFacturacion2.getTotal()));
		}
	}
	
	public void unSelectFactura(){
		System.out.println("Deseleccionar Factura");
		CompraFacturacion[] compraFacturacion = this.bkLetraPorPagar.getFacturasSeleccionadas();
		this.bkLetraPorPagar.setMontoTotal(new BigDecimal(0));
		for (CompraFacturacion compraFacturacion2 : compraFacturacion) {
			System.out.println(compraFacturacion2.getId());
			this.bkLetraPorPagar.setMontoTotal(this.bkLetraPorPagar.getMontoTotal().subtract(compraFacturacion2.getTotal()));
		}
	}

	@Override
	public String guardar() {
		try{
			logger.info("guardando letra por pagar");
			if(validarRegistro()){
				Letra letra = new Letra();
				letra.setEstadoLetra(this.bkLetraPorPagar.getEstadoSeleccionado().getId());
				letra.setEstadoRegistro(pe.com.cotelasa.seguridad.common.util.Constantes.EstadoRegistro.ESTADO_REGISTRO_ACTIVO);
				letra.getProveedor().setId(this.bkLetraPorPagar.getProveedorSeleccionado().getId());
				letra.setNumeroLetra(this.bkLetraPorPagar.getNumeroLetra().toString());
				letra.getTipoMoneda().setId(this.bkLetraPorPagar.getTipoMonedaSeleccionado().getId());
				letra.setTipoLetra(Constantes.TipoLetra.LETRA_POR_PAGAR);
				letra.setTotal(this.bkLetraPorPagar.getMontoTotal());
				letra.setFecCreacion(new Date());
				letra.setFecEmision(new Date());
				letra.setUsrCreacion(bkSession.getUsuario().getUsuario());
				letra.setFormaDePago("C");
				letra.setFecVencimiento(this.bkLetraPorPagar.getRegistrarFechaVencimiento());
				letra.setIdCliente(null);
				this.bkLetraPorPagar.getFacturasSeleccionadas();
				
				List<CompraFacturacion> listaDetalle = Arrays.asList(this.bkLetraPorPagar.getFacturasSeleccionadas());
				List<DetalleLetra> listaDetalleLetra = new ArrayList<DetalleLetra>();
				for (CompraFacturacion compraFacturacion : listaDetalle) {
					DetalleLetra detalleLetra = new DetalleLetra();
					detalleLetra.setIdLetra(letra);
					detalleLetra.setIdCompraFacturacion(compraFacturacion);
					detalleLetra.setEstadoRegistro(EstadoRegistro.ESTADO_REGISTRO_ACTIVO);
					detalleLetra.setFecCreacion(new Date());
					detalleLetra.setUsrCreacion(bkSession.getUsuario().getUsuario());
					listaDetalleLetra.add(detalleLetra);
				}
				letra.setDetalleLetraCollection(listaDetalleLetra);
				servicioLetraDeCambio.guardarLetraDeCambio(letra);
				mostrarMensaje("Se registro los datos satisfactoriamente");
				this.bkLetraPorPagar.getProveedorSeleccionado().setId(0);
				this.bkLetraPorPagar.getTipoMonedaSeleccionado().setId(0);
				this.bkLetraPorPagar.setEstadoSeleccionado(ESTADO_LETRA_DE_CAMBIO.TODOS);
			}else{
				return "";
			}
		}catch(Exception e){
			e.printStackTrace();
			mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
			logger.error(e.getMessage(), e);
			return "";
		}	
		return URLPaginacion.LetraPorPagar.URL_FORMULARIO_LETRA_POR_PAGAR;
	}
	
	private boolean validarRegistro(){
		if(this.bkLetraPorPagar.getBancoSeleccionado()==0){
			mostrarWarning("Seleccionar un banco");
			return false;
		}else if(this.bkLetraPorPagar.getRegistrarFechaVencimiento()==null){
			mostrarWarning("Seleccionar un fecha de vencimiento");
			return false;
		}else if(this.bkLetraPorPagar.getTipoMonedaSeleccionado().getId()==0){
			mostrarWarning("Seleccionar un tipo de moneda");
			return false;
		}else if(this.bkLetraPorPagar.getProveedorSeleccionado().getId()==0){
			mostrarWarning("Seleccionar un proveedor");
			return false;
		}else if(this.bkLetraPorPagar.getNumeroLetra()==null || this.bkLetraPorPagar.getNumeroLetra().length()<=0){
			mostrarWarning("Ingresar un numero de letra");
			return false;
		}else if(this.bkLetraPorPagar.getListaFacturasPorCobrar() ==null && this.bkLetraPorPagar.getListaFacturasPorCobrar().size()<=0){
			mostrarWarning("Debe seleccionar alguna factura por cobrar");
			return false;
		}else {
			return true;
		}
	}

	@Override
	public void eliminar(ActionEvent actionEvent) {
		// TODO Auto-generated method stub
	}

	@Override
	public String editar() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String nuevo() {
		limpiar();
		this.bkLetraPorPagar.setEstadoSeleccionado(ESTADO_LETRA_DE_CAMBIO.POR_CANCELAR);
		this.bkLetraPorPagar.setLetraPorPagarModel(new LetraPorPagarModel(new ArrayList<CompraFacturacion>()));
		return URLPaginacion.LetraPorPagar.URL_FORMULARIO_AGREGAR_LETRA_POR_PAGAR;
	}

	@Override
	public String ver() {
		// TODO Auto-generated method stub 
		return null;
	}
	
	public void detalle() {
		try{
			Letra letraSeleccionado = this.bkLetraPorPagar.getLetraSeleccionada();
			System.out.println("letraSeleccionado " + letraSeleccionado);
			if(letraSeleccionado !=null ){ 
				letraSeleccionado = servicioLetraDeCambio.obtenerLetradeCambio(letraSeleccionado.getId());
				System.out.println("size:"+letraSeleccionado.getDetalleLetraCollection().size());
				bkLetraPorPagar.setListaDetalleLetra(new ArrayList<DetalleLetra>(letraSeleccionado.getDetalleLetraCollection()));
			}else{
				bkLetraPorPagar.setListaDetalleLetra(new ArrayList<DetalleLetra>());
			}	
		}catch(Exception e){
			 mostrarError("Error al cargar el detalle de la letra: " + e.getMessage());
			 logger.error(e.getMessage(),e);
		}		
	}
	
	public void anular(Letra letraSeleccionado) {
		try{
			letraSeleccionado.setEstadoRegistro(EstadoRegistro.ESTADO_REGISTRO_ELIMINADO);
			servicioLetraDeCambio.anularLetra(letraSeleccionado);
			mostrarMensaje("El registro se anulo satisfactoriamente.");
			buscarListaLetrasPorPagar();
		}catch(Exception e){
			 mostrarError("Error al anular la letra: " + e.getMessage());
			 logger.error(e.getMessage(),e);
		}	
	}
	
	public void cancelacion(Letra letraSeleccionado){
		try{
			letraSeleccionado.setFecCancelacion(new Date());
			letraSeleccionado.setEstadoLetra(ESTADO_LETRA_DE_CAMBIO.CANCELADO.getId());
			servicioLetraDeCambio.cancelarLetraDeCambio(letraSeleccionado);
			mostrarMensaje("Se registro la cancelacion satisfactoriamente.");
		}catch(Exception e){
			 mostrarError("Error al registrar la cancelacion de la letra: " + e.getMessage());
			 logger.error(e.getMessage(),e);
		}
	}

	@Override
	public String aceptar() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String retroceder() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String cancelar() {
		limpiar();
		return URLPaginacion.LetraPorPagar.URL_FORMULARIO_LETRA_POR_PAGAR;
	}
	
    public void onEdit(RowEditEvent event) {  
    	try {
        	Letra letra = (Letra) event.getObject();
        	letra.setUsrModificacion(bkSession.getUsuario().getUsuario());
        	letra.setFecModificacion(new Date());
        	servicioLetraDeCambio.actualizarFechaVencimientoLetra(letra);
		} catch (Exception e) {
			 mostrarError("Error al modificar la fecha de cancelacion de la letra: " + e.getMessage());
			 logger.error(e.getMessage(),e);
		}

    }  
      
    public void onCancel(RowEditEvent event) {  
  
    }  
	
	private void limpiar(){
		this.bkLetraPorPagar.setProveedorSeleccionado(new Proveedor(0));
		this.bkLetraPorPagar.setTipoMonedaSeleccionado(new TipoMoneda(0));
		this.bkLetraPorPagar.setEstadoSeleccionado(ESTADO_LETRA_DE_CAMBIO.SELECCIONE);
		this.bkLetraPorPagar.setListaLetrasPorPagar(null);
		this.bkLetraPorPagar.setNumeroLetra(null);
		this.bkLetraPorPagar.setFechaVencimientoSeleccionado(new Date());
		this.bkLetraPorPagar.setBancoSeleccionado(0);
//		this.bkLetraPorPagar.getListaLetrasPorPagar().clear();
		
	}
}
